﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TaxiCaosWeb.Models;
using System.ServiceModel;
using System.Web.UI;
using System.Net;


namespace TaxiCaosWeb.Controllers
{
    public class ReservaController : Controller
    {
        public ActionResult IniciarReserva()
        {
            Session["TarifarioDescuento"] = null;
            return RedirectToAction("Reserva");
        }

        public ActionResult Reserva()
        {
            Reserva reserva = new Reserva();

            ViewData["DistritosOrigen"] = new SelectList(retornaListaDistritosOrigen(),"IdCatalogo", "Descripcion");
            ViewData["DistritosDestino"] = new SelectList(retornaListaDistritosDestino(), "IdCatalogo", "Descripcion"); 

            if (Session["ClienteSesion"] != null)
            {
                Cliente clienteSesion = (Cliente)Session["ClienteSesion"];
                if (clienteSesion.TipoCliente.Equals("PNATURAL"))
                {
                    reserva.Nombres = clienteSesion.Nombres;
                    reserva.Apellidos = clienteSesion.Apellidos;
                    reserva.Telefono = clienteSesion.Telefono.ToString();
                    reserva.Email = clienteSesion.Email;
                }                
            }

            if (Session["TarifarioDescuento"] != null)
            {
                TarifarioDescuento tarifarioDescuento = (TarifarioDescuento)Session["TarifarioDescuento"];
                ViewData["DistritosOrigen"] = new SelectList(retornaListaDistritosOrigen(), "IdCatalogo", "Descripcion", tarifarioDescuento.Tarifario.IdOrigen.Trim());
                ViewData["DistritosDestino"] = new SelectList(retornaListaDistritosDestino(), "IdCatalogo", "Descripcion", tarifarioDescuento.Tarifario.IdDestino.Trim()); 
                reserva.Importe = tarifarioDescuento.MontoTotal.ToString();
            }

            return View(reserva);
        }

        [HttpPost]
        public ActionResult Reserva(FormCollection formCollection)
        {
            ViewData["DistritosOrigen"] = new SelectList(retornaListaDistritosOrigen(), "IdCatalogo", "Descripcion");
            ViewData["DistritosDestino"] = new SelectList(retornaListaDistritosDestino(), "IdCatalogo", "Descripcion"); 

            ReservasWS.ReservasClient proxyReserva = new ReservasWS.ReservasClient();

            // Se obtiene el cliente de sesion
            Cliente clienteSesion = (Cliente)Session["ClienteSesion"];
            Nullable<int> idCliente = clienteSesion == null ? null : (int?)clienteSesion.IdCliente;
            string tipoReserva = clienteSesion == null ? "FREE" : "CLNT";

            // Se obtiene la tarifa y los montos
            TarifarioDescuento tarifarioDescuento = (TarifarioDescuento)Session["TarifarioDescuento"];
            int idTarifa = tarifarioDescuento.Tarifario.IdTarifa;
            double montoBruto = tarifarioDescuento.Tarifario.Monto;
            double descuento = tarifarioDescuento.Descuento.PorcentajeDescuento;
            double montoNeto = tarifarioDescuento.MontoTotal;

            // Se arma la fecha y hora
            string[] fecha = formCollection.Get("Fecha").Split('/');
            string[] hora = formCollection.Get("Hora").Split(':');
            DateTime fechaYHora = new DateTime(int.Parse(fecha[2]), int.Parse(fecha[1]), int.Parse(fecha[0]), int.Parse(hora[0]), int.Parse(hora[1]), 0);

            string mensaje = "";
            string tipoMensaje = "";
            try
            {
                ReservasWS.Reserva reservaRegistrada = proxyReserva.RegistrarReserva(idCliente, idTarifa, tipoReserva, formCollection.Get("Nombres"), formCollection.Get("Apellidos"), formCollection.Get("Telefono"), formCollection.Get("Email"), fechaYHora, formCollection.Get("Direccion"), formCollection.Get("Comentarios"), montoBruto, descuento, montoNeto);
                mensaje = "Se ha generado la reserva con el Nro " + reservaRegistrada.Ticket + " satisfactoriamente";
                Session["ReservaRegistrada"] = reservaRegistrada;
                tipoMensaje = "INFO";
            }
            catch (FaultException<ReservasWS.ReservaException> ex)
            {
                mensaje = ex.Message;
                tipoMensaje = "WARN";
            }
            return (Json(new { mensaje = mensaje, tipoMensaje = tipoMensaje, redirectTo = Url.Action("IniciarReserva") }, JsonRequestBehavior.DenyGet));

        }

        public ActionResult ElegirTipo()
        {
            Session["TarifarioDescuento"] = null;
            return View();
        }


        public ActionResult ConfirmaReserva()
        {
            return RedirectToAction("Pago", "Pago");
        }

        public ActionResult Tarifario()
        {
            //Seteo de constante con valor 0
            int Zero = 0;

            double MontoBruto_ = Zero;
            double PorcentajeDescuento_ = Zero;
            double MontoNeto_ = Zero;

            TarifarioDescuento _TarifarioDescuento = new TarifarioDescuento();
            Tarifario _Tarifario = new Tarifario();
            Descuento _Descuento = new Descuento();

            //Se llena el valor de las listas despegables
            ViewData["DistritosOrigen"] = retornaListaDistritosOrigen();
            ViewData["DistritosDestino"] = retornaListaDistritosDestino();

            //Si existe valores en Session
            if (Session["TarifarioDescuento"] != null)
            {
                //Se instancia con los valores de la session
                TarifarioDescuento tarifariodescuento_ = (TarifarioDescuento)Session["TarifarioDescuento"];

                //Se asignan los valores de la Session a los ViewData[]
                string distriOrigValueSelected = tarifariodescuento_.Tarifario.IdOrigen.Trim();
                string distritoDestValueSelected = tarifariodescuento_.Tarifario.IdDestino.Trim();

                ViewData["distriOrigValueSelected"] = distriOrigValueSelected;
                ViewData["distritoDestValueSelected"] = distritoDestValueSelected;

                MontoBruto_ = tarifariodescuento_.Tarifario.Monto;
                PorcentajeDescuento_ = tarifariodescuento_.Descuento.PorcentajeDescuento;
                MontoNeto_ = tarifariodescuento_.MontoTotal;
            }
            //Si no existen valores en Session
            else
            {
                //Se asigna la constane a los ViewData[]
                //ViewData["MontoTarifa"] = Zero;
                //ViewData["PorcentajeDescuento"] = Zero;
                //ViewData["MontoTotal"] = Zero;
            }

            _Tarifario.Monto = MontoBruto_;
            _Descuento.PorcentajeDescuento = PorcentajeDescuento_;

            _TarifarioDescuento.Tarifario = _Tarifario;
            _TarifarioDescuento.Descuento = _Descuento;
            _TarifarioDescuento.MontoTotal = MontoNeto_;

            return View(_TarifarioDescuento);
        }

        [HttpPost]
        public ActionResult Tarifario(FormCollection formCollection)
        {
            //Inicialización de variables
            string distriOrigValue = "";
            string distritoDestValue = "";
            int Zero = 0;
            int CantidadReservaRegistrada = Zero;
            string TipoMensaje_ = "";

            double MontoBruto_ = Zero;
            double PorcentajeDescuento_ = Zero;
            double MontoNeto_ = Zero;

            //Asignación de listas despegables
            ViewData["DistritosOrigen"] = retornaListaDistritosOrigen();
            ViewData["DistritosDestino"] = retornaListaDistritosDestino();

            //Obtener el valor de la lista despegable del formulario
            distriOrigValue = formCollection.Get("distritoOrig");
            distritoDestValue = formCollection.Get("distritoDest");

            //Asignar el valor seleccionado a los ViewData[]
            ViewData["distriOrigValueSelected"] = distriOrigValue;
            ViewData["distritoDestValueSelected"] = distritoDestValue;

            //Se obtiene la cantidad de reservas del cliente
            if (Session["ClienteSesion"] != null)
            {
                Cliente clienteSesion = (Cliente)Session["ClienteSesion"];

                ReservasWS.ReservasClient proxyReserva = new ReservasWS.ReservasClient();
                CantidadReservaRegistrada = proxyReserva.ObtenerCantidadReservas(clienteSesion.IdCliente);

            }
            
                //Obtener los valores del Tarifario y Descuento
                TarifarioDescuento tarifariodescuento = (retornarTarifarioWS(distriOrigValue, distritoDestValue, CantidadReservaRegistrada));


                if (tarifariodescuento != null)
                {
                    MontoBruto_ = tarifariodescuento.Tarifario.Monto;
                    PorcentajeDescuento_ = tarifariodescuento.Descuento.PorcentajeDescuento;
                    tarifariodescuento.MontoTotal = tarifariodescuento.Tarifario.Monto - (tarifariodescuento.Tarifario.Monto * (tarifariodescuento.Descuento.PorcentajeDescuento / 100));
                    MontoNeto_ = tarifariodescuento.MontoTotal;
                }

                Session["TarifarioDescuento"] = tarifariodescuento;

                if (ViewData["ErrorTarifario"].ToString() != "")
                {
                    TipoMensaje_ = "WARN";
                }
           
            return (Json(new { MontoBruto = MontoBruto_, PorcentajeDescuento = PorcentajeDescuento_, TipoMensaje = TipoMensaje_,  MontoNeto = MontoNeto_, Message = ViewData["ErrorTarifario"].ToString()}, JsonRequestBehavior.DenyGet));

        }

        private TarifarioDescuento retornarTarifarioWS(string distritoOrig, string distritoDest, int cantidad)
        {
            //Se instancia el servicio Web
            TarifariosWS.TarifariosClient proxy = new TarifariosWS.TarifariosClient();

            //Se inicializa la variable
            string MensajeEx = "";

            try
            {
                //Se invoca a la operación de servicio
                ViewData["ErrorTarifario"] = MensajeEx;

                TarifariosWS.TarifarioDescuento tarifario = proxy.ObtenerTarifarioPorOrigenYDestino(distritoOrig, distritoDest, cantidad);
                
                Tarifario _tarifario = new Tarifario();
                _tarifario.IdTarifa = tarifario.Tarifario.IdTarifa;
                _tarifario.IdOrigen = tarifario.Tarifario.IdOrigen;
                _tarifario.IdDestino = tarifario.Tarifario.IdDestino;
                _tarifario.Monto = tarifario.Tarifario.Monto;

                Descuento _descuento = new Descuento();
                
                if (tarifario.Descuento != null)
                {
                    _descuento.IdDescuento = tarifario.Descuento.IdDescuento;
                    _descuento.Cantidad = tarifario.Descuento.Cantidad;
                    _descuento.PorcentajeDescuento = tarifario.Descuento.PorcentajeDescuento;
                    _descuento.Comentario = tarifario.Descuento.Comentario;
                }
                TarifarioDescuento tarifario_ = new TarifarioDescuento();
                tarifario_.Tarifario = _tarifario;
                tarifario_.Descuento = _descuento;
                tarifario_.Message = MensajeEx;

                return tarifario_;
            }
            catch (FaultException<TarifariosWS.TarifarioException> ex)
            {
                //Se muestra mensaje obtenido
                MensajeEx = ex.Message;
                ViewData["ErrorTarifario"] = MensajeEx;
               return null;
            } 
        }

        private List<Catalogo> retornaListaDistritosOrigen() { 
        
            if(Session["listaDistritosOrigen"] == null) {
                Session["listaDistritosOrigen"] = retornarListaDistritosWS();
            }
            return (List<Catalogo>)Session["listaDistritosOrigen"];
        }

        private List<Catalogo> retornaListaDistritosDestino()
        {

            if (Session["listaDistritosDestino"] == null)
            {
                Session["listaDistritosDestino"] = retornarListaDistritosWS();
            }
            return (List<Catalogo>)Session["listaDistritosDestino"];
        }

        private List<Catalogo> retornarListaDistritosWS()
        {
            CatalogosWS.CatalogosClient proxy = new CatalogosWS.CatalogosClient();

            IList<CatalogosWS.Catalogo> lista = proxy.ObtenerListaPorTipoCatalogo("UBIGEO");

            List<Catalogo> listaDistritos = new List<Catalogo>();
            Catalogo distrito;
            foreach (CatalogosWS.Catalogo distritoWS in lista)
            {
                distrito = new Catalogo();
                distrito.IdCatalogo = distritoWS.Codigo;
                distrito.Descripcion = distritoWS.Descripcion;
                listaDistritos.Add(distrito);
            }
            return listaDistritos;
        }
    }
}